import java.util.Scanner;

public class day230509 {
    // 蘑菇阵
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int m = sc.nextInt();
            int k = sc.nextInt();
            // 多定义一行一列
            int[][] map = new int[n + 1][m + 1];

            for (int i = 0; i < k; i++) {
                int x = sc.nextInt();
                int y = sc.nextInt();
                // 放蘑菇
                map[x][y] = 1;
            }

            // 多定义一行一列
            double[][] dp = new double[n + 1][m + 1];
            // 初始化
            dp[1][1] = 1.0;

            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= m; j++) {
                    if (map[i][j] == 1) {
                        // 是蘑菇
                        continue;
                    }

                    // 不管 (1,1), A的初始位置
                    if (!(i == 1 && j == 1)) {
                        // 如果在边界上, 最底部 和 最右侧, 那么只有一个方向可以走
                        // 在边界上 * 1 , 不在边界上 * 5
                        dp[i][j] = dp[i - 1][j] * (j == m ? 1 : 0.5)
                                + dp[i][j - 1] * (i == n ? 1 : 0.5);
                    }
                }
            }

            System.out.printf("%.2f\n", dp[n][m]);
        }
    }


    // 红与黑
    public static void main1(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int m = sc.nextInt();
            int n = sc.nextInt();
            sc.nextLine();
            int x = 0;
            int y = 0;
            // 多定义两行两列，作为边界
            char[][] arr = new char[m + 2][n + 2];
            for (int i = 1; i <= m; i++) {
                String s = sc.nextLine();
                for (int j = 1; j <= n; j++) {
                    arr[i][j] = s.charAt(j - 1);
                    if (arr[i][j] == '@') {
                        // 记录初始位置
                        x = i;
                        y = j;
                    }
                }
            }
            System.out.println(calcBlackCount(arr, x, y));
        }
    }

    private static int calcBlackCount(char[][] arr, int x, int y) {
        if (arr[x][y] == '#' || arr[x][y] == 'x' || arr[x][y] == 0) {
            // 递归结束条件： 红色的瓷砖，走过的黑色瓷砖，边界
            return 0;
        }
        // 标记为走过的
        arr[x][y] = 'x';
        return 1 + calcBlackCount(arr, x - 1, y) + calcBlackCount(arr, x + 1, y)
                + calcBlackCount(arr, x, y - 1) + calcBlackCount(arr, x, y + 1);
    }
}
